import axios from "axios";
import config from "../configs/requestindex";
import { ElMessage } from "element-plus";
import Cookies from "js-cookie";
// 在拦截器中无法直接获取router实例，需要由其他文件保存后导入使用
import { app, router } from "../main";
const NETWORK_ERROR = "网络请求异常,请稍后重试.....";
// 创建一个axios实例对象
const service = axios.create({
  baseURL: config.baseApi,
});

// 在请求之前拦截
service.interceptors.request.use(
  (req) => {
    let token = Cookies.get("token") ? JSON.parse(Cookies.get("token")) : null;
    if (token) {
      req.headers["token"] = token; // 设置请求头
    }
    return req;
  },
  (error) => {
    return Promise.reject(error);
  }
);
// 在请求之后拦截
service.interceptors.response.use((res) => {
  console.log("router", router);
  const { code, data, message } = res.data;
  if (code == 200) {
    return res.data;
  } else if (code == 502) {
    ElMessage.error(message || "登录过期，请重新登录");
    router.push({
      name: "login",
    });
  } else if (code == 503) {
    ElMessage.error(message || "密码修改，请重新登录");
    router.push({
      name: "login",
    });
  } else {
    // 网络请求错误或者其他错误
    ElMessage.error(message || NETWORK_ERROR);
    return Promise.reject(message || NETWORK_ERROR);
  }
});

// 封装的核心函数 options:前端请求的参数
function request(options) {
  options.method = options.method || "get";
  //转成小写get
  if (options.method.toLowerCase() == "get") {
    options.params = options.data;
  }
  // 对mock的处理 覆盖配置文件里的mock
  let isMock = config.mock;
  if (typeof options.mock !== "undefined") {
    isMock = options.mock;
  }
  // 对线上环境做处理
  if (config.env == "prod") {
    // 不给用到mock的机会
    service.defaults.baseURL = config.baseApi;
  } else {
    service.defaults.baseURL = isMock ? config.mockApi : config.baseApi;
  }
  //
  return service(options);
}
export default request;
